package es.udima.geo.geoserver.entities;

import java.io.Serializable;
import java.util.Calendar;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

/**
 * <p>Entidad que representa un dato de geolocalización.</p>
 * 
 * @author david
 */
@Entity
@Table(name = "userGpsData")
@IdClass(value = GpsDataPK.class)
public class GpsData implements Comparable<GpsData>, Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * Identificador del usuario al que pertenece el punto.
     */
    @Id
    private String userId;
    
    /**
     * Momento en que se realizó la captura de la posición.
     */
    @Id
    @Temporal(TemporalType.TIMESTAMP)
    private Calendar fetchTime;
    
    /**
     * Latitud de las coordenadas en formato decimal.
     */
    private double lat;
    
    /**
     * Longitud de las coordenadas en formato decimal.
     */
    private double lon;
    
    /**
     * Distancia en metros desde un punto anterior (cuando los datos gps se muestran contenidos en una lista que representa una ruta).
     */
    @Transient
    private double distanceFromPrevious;
	
    /**
     * Tiempo en milisegundos transcurrido durante el trayecto desde un punto anterior (cuando los datos gps se muestran contenidos en una lista que representa una ruta).
     */
    @Transient
    private double lapseTimeFromPrevious;
	
    /**
     * Velocidad media en km/h durante el trayecto desde un punto anterior (cuando los datos gps se muestran contenidos en una lista que representa una ruta).
     */
    @Transient
    private double speedFromPrevious; 

    /**
     * Constructor
     */
    public GpsData() {

    }

    /**
     * Constructor.
     * 
     * @param userId
     * @param fetchTime
     * @param lat
     * @param lon
     */
    public GpsData(String userId, Calendar fetchTime, double lat, double lon) {
	this.userId = userId;
	this.fetchTime = fetchTime;
	this.lat = lat;
	this.lon = lon;
    }

    public String getUserId() {
	return userId;
    }

    public void setUserId(String userId) {
	this.userId = userId;
    }

    public Calendar getFetchTime() {
	return fetchTime;
    }

    public void setFetchTime(Calendar fetchTime) {
	this.fetchTime = fetchTime;
    }

    public double getLat() {
	return lat;
    }

    public void setLat(double lat) {
	this.lat = lat;
    }

    public double getLon() {
	return lon;
    }

    public void setLon(double lon) {
	this.lon = lon;
    }

    public double getDistanceFromPrevious() {
	return distanceFromPrevious;
    }

    public void setDistanceFromPrevious(double distanceFromPrevious) {
	this.distanceFromPrevious = distanceFromPrevious;
    }

    public double getLapseTimeFromPrevious() {
	return lapseTimeFromPrevious;
    }

    public void setLapseTimeFromPrevious(double lapseTimeFromPrevious) {
	this.lapseTimeFromPrevious = lapseTimeFromPrevious;
    }

    public double getSpeedFromPrevious() {
	return speedFromPrevious;
    }

    public void setSpeedFromPrevious(double speedFromPrevious) {
	this.speedFromPrevious = speedFromPrevious;
    }

    @Override
    public String toString() {
	return "GpsData [userId=" + userId + ", fetchTime=" + fetchTime + ", lat=" + lat + ", lon=" + lon + ", distanceFromPrevious="
		+ distanceFromPrevious + ", lapseTimeFromPrevious=" + lapseTimeFromPrevious + ", speedFromPrevious=" + speedFromPrevious + "]";
    }

    /**
     * Compara dos objetos GpsData según el identificador de usuario y el atributo fetchTime
     */
    @Override
    public int compareTo(GpsData o) {
	int res = this.getUserId().compareTo(o.getUserId());
	if (res == 0) {
	    res = this.getFetchTime().compareTo(o.getFetchTime());
	}
	return res;
    }
}
